/*
 * Copyright (c) 2013, 5 Idiots. All rights reserved.
 */
package safari.controller.sell;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import safari.model.common.ListVO;
import safari.model.member.MemberVO;
import safari.model.sell.SellBoardSearchVO;
import safari.model.sell.SellBoardService;
import safari.model.sell.SellBoardVO;
/**
 * SellBoardController 클래스
 * @author Harry
 *
 */
public class SellBoardController extends MultiActionController{
	// path : 파일 저장 경로
	private String path;
	public void setPath(String path){
		this.path=path;
	}
	private SellBoardService sellBoardService;
	/**
	 * SellBoardController의 생성자 
	 * 이 생성자의 인자값에 Spring DI 기법으로 sellBoardService bean을 주입해서 
	 * sellBoardService를 사용한다.
	 * @param sellBoardService
	 */
	public SellBoardController(SellBoardService sellBoardService){
		this.sellBoardService=sellBoardService;
	}
	/**
	 * 글 작성하기 페이지로 이동하는 메서드
	 * 로그인을 하지 않으면 글을 작성할 수 없다.
	 * @param request
	 * @param response
	 * @param session
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView getWriteView(HttpServletRequest request, 
			HttpServletResponse response, HttpSession session) throws SQLException{
		// urlPath : View 페이지 경로
		String urlPath="sell/sell_write";
		MemberVO mvo=(MemberVO)session.getAttribute("userInfo");
		// 비로그인 상태에서는 상세글을 볼 수 없으므로, 로그인 페이지로 이동시킨다.
		if(mvo==null){
			urlPath="sell/sellLogin";
		}
		return new ModelAndView(urlPath);
	}
	/**
	 * 새 글을 작성하는 메서드
	 * 글 등록 성공시에는 글 상세보기 페이지로 이동한다.
	 * @param svo
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView writeContent(HttpServletRequest request, 
			HttpServletResponse response, HttpSession session, SellBoardVO svo) throws SQLException{
		MemberVO mvo=(MemberVO)session.getAttribute("userInfo");
		// 비로그인 상태에서는 글을 작성할 수 없으므로, 로그인 페이지로 이동시킨다.
		if(mvo==null){
			return new ModelAndView("sell/sellLogin");
		}
		// 글을 작성할 때 회원의 아이디 및 이름의 정보를 같이 입력해야 한다.
		// SellBoardVO 타입의 객체인 svo의 setter를 이용해서 
		// MemberVO 타입의 변수 mvo에 setting 하였다.
		svo.setMvo(mvo);
		// 회원이 업로드한 이미지의 시간정보를 String 타입의 변수로 저장한다.   
		Long now=System.currentTimeMillis();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy년MM월dd일HH시mm분ss초_");
		String currentTime=sdf.format(now);
		/* 파일 업로드 로직 */
		// 업로드한 파일을 받아 원본이름을 String 타입의 변수에 저장한다.
		MultipartFile mFile=svo.getUploadFile();
		String orgFileName=mFile.getOriginalFilename();
		// 업로드한 파일 존재할때는 파일저장과 동시에 DB에 원본파일명과 실제 저장된 파일명을 기록한다.
		if(orgFileName!=""){
			String destFileName=currentTime+orgFileName;
			File copyFile=new File(path+destFileName);
			try {
				mFile.transferTo(copyFile);
				svo.setOrgFileName(orgFileName);
				svo.setDestFileName(destFileName);
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		// 글 작성 정보를 SellBoardService로 넘긴다.
		svo=sellBoardService.writeContent(svo);
		// 등록한 글의 번호
		int sellNo=svo.getSellNo();
		// 바로 sell_content.jsp로 보내면, 페이지에서 새로고침을 누를때 
		// 같은 글이 중복 등록되기 때문에 
		// redirect 방식으로 showContent 메서드를 호출해야 한다.
		return new ModelAndView("redirect:sell.do?command=showContent&sellNo="+sellNo);
	}
	/**
	 * 상세 글보기 페이지를 불러오는 메서드
	 * @param request
	 * @param response
	 * @param session
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView showContent(HttpServletRequest request, 
			HttpServletResponse response, HttpSession session) throws SQLException{
		int sellNo=Integer.parseInt(request.getParameter("sellNo"));
		MemberVO mvo=(MemberVO)session.getAttribute("userInfo");
		// 비로그인 상태에서는 글을 열람할 수 없으므로, 로그인 페이지로 이동시킨다.
		if(mvo==null){
			return new ModelAndView("sell/sellLogin");
		}
		String id=mvo.getId();
		SellBoardVO svo=sellBoardService.showContent(sellNo, id);
		return new ModelAndView("sell/sell_content","svo",svo);
	}
	/**
	 * 게시판 목록을 불러오는 메서드
	 * @param request
	 * @param response
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView getContentList(HttpServletRequest request, 
			HttpServletResponse response) throws SQLException{
		int nowPage=Integer.parseInt(request.getParameter("pageNo"));
		ListVO lvo=sellBoardService.getContentList(nowPage);
		return new ModelAndView("sell/sell_list","lvo",lvo);
	}
	/**
	 * 판매글을 삭제하는 메서드이다.
	 * 판매완료된 글은 삭제할 수 없다.
	 * @param request
	 * @param response
	 * @param session
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView deleteContent(HttpServletRequest request, 
			HttpServletResponse response, HttpSession session) throws SQLException{
		int sellNo=Integer.parseInt(request.getParameter("sellNo"));
		String destFileName=request.getParameter("destFileName");
		String sellStatus=request.getParameter("sellStatus");
		String sellContentWriter=request.getParameter("sellContentWriter");
		// resultMessage : 글 삭제 결과 메세지
		String resultMessage="";
		String urlPath="../error";
		MemberVO mvo=(MemberVO)session.getAttribute("userInfo");
		// 글 삭제시 글 번호와 글 작성자 아이디값을 조건으로 삭제해야 하므로 세션의 아이디 값을 저장해서 넘겨야 한다.
		String id=mvo.getId();
		String grade=mvo.getGrade();
		System.out.println("grade 나와봐: "+grade);
		if((!id.equals(sellContentWriter))&&(!grade.equals("admin"))){
			resultMessage="글 작성자만 글 삭제가 가능합니다.";
			urlPath="sell_delete_result";
		}else if((sellStatus.equals("판매완료"))&&(id.equals(sellContentWriter))){
			resultMessage="판매완료된 글은 삭제할 수 없습니다.";
			urlPath="sell_delete_result";
		// 글의 상품이 '판매중'일때, 해당 글과 업로드 되어있는 파일을 삭제한다.  
		}else if((sellStatus.equals("판매중"))||(grade.equals("admin"))){
			SellBoardVO svo=new SellBoardVO();
			svo.setSellNo(sellNo);
			svo.setDestFileName(destFileName);
			svo.setMvo(new MemberVO(sellContentWriter));
			File file=new File(this.path+destFileName);
				file.delete();
			sellBoardService.deleteContent(svo);
			resultMessage="해당 글을 삭제하셨습니다.";
			urlPath="sell_delete_result";
		}
		return new ModelAndView("sell/"+urlPath,"resultMessage",resultMessage);
	}
	/**
	 * 판매 글 수정 페이지를 보여주는 메서드
	 * @param request
	 * @param response
	 * @param session
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView updateView(HttpServletRequest request, 
			HttpServletResponse response, HttpSession session) throws SQLException{
		MemberVO mvo=(MemberVO)session.getAttribute("userInfo");
		int sellNo=Integer.parseInt(request.getParameter("sellNo"));
		// 로그인한 사용자의 아이디
		String id=mvo.getId();
		// 글 작성자의 아이디
		String sellContentWriter=request.getParameter("sellContentWriter");
		// 로그인 사용자가 글 작성자가 아니라면 글을 수정할 수 없도록 한다.
		if(!id.equals(sellContentWriter)){
			return new ModelAndView("sell/sell_update_fail","resultMessage","글 작성자만 수정이 가능합니다.");
		}
		SellBoardVO svo=sellBoardService.updateView(sellNo);
		return new ModelAndView("sell/sell_update","svo",svo);
	}
	/**
	 * 판매글 수정하는 메서드
	 * 판매완료된 글을 수정할 수 없다.
	 * @param request
	 * @param response
	 * @param session
	 * @param svo
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView updateContent(HttpServletRequest request, 
			HttpServletResponse response, HttpSession session, SellBoardVO svo) throws SQLException{
		String sellStatus=request.getParameter("sellStatus");
		String sellContentWriter=request.getParameter("sellContentWriter");
		MemberVO mvo=(MemberVO)session.getAttribute("userInfo");
		String urlPath="error";
		// 비로그인 상태에서는 글을 수정할 수 없으므로, 로그인 페이지로 이동시킨다.
		if(mvo==null){
			urlPath="sell/sellLogin";
		}
		svo.setMvo(mvo);
		String id=mvo.getId();
		if(!id.equals(sellContentWriter)){
			urlPath="sell_update_fail";
			return new ModelAndView("sell/"+urlPath,"resultMessage", "글 작성자만 글 수정이 가능합니다.");
		}else if(sellStatus.equals("판매완료")){
			urlPath="sell_update_fail";
			return new ModelAndView("sell/"+urlPath,"resultMessage", "판매완료된 글은 수정할 수 없습니다.");
		}else if(sellStatus.equals("판매중")){
			String orgFileName="";
			// 회원이 업로드한 이미지의 시간정보를 String 타입의 변수로 저장한다.   
			Long now=System.currentTimeMillis();
			SimpleDateFormat sdf=new SimpleDateFormat("yyyy년MM월dd일HH시mm분ss초_");
			String currentTime=sdf.format(now);
			/* 파일 업로드 로직 */
			// 참고) 파일 업로드 버튼이 존재하지 않을때는 mFile값은 null이다.
			MultipartFile mFile=svo.getUploadFile();
			if(mFile!=null){
				// 업로드한 파일을 받아 원본이름을 String 타입의 변수에 저장한다.
				orgFileName=mFile.getOriginalFilename();
				// 파일을 업로드하고 글을 수정하면 파일 저장 과 파일명, 그리고 기타 변경한 정보들이 DB에 업데이트된다.
				if(orgFileName!=""){
					String destFileName=currentTime+orgFileName;
					File copyFile=new File(this.path+destFileName);
					try {
						mFile.transferTo(copyFile);
						svo.setOrgFileName(orgFileName);
						svo.setDestFileName(destFileName);
					} catch (IllegalStateException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					}
					svo=sellBoardService.updateContent(svo);
				// 만약 파일을 업로드 하지 않은 상태에서 글을 수정해도, 
				// 파일 정보를 제외한 나머지 변경된 정보들만 DB에 갱신된다.
				}else{
					svo=sellBoardService.updateContentExceptFile(svo);
				}
			}
			// 만약 업로드된 파일을 삭제(변경)하지 않고 글을 수정한다면,
			// 파일 정보를 제외한 나머지 변경된 정보들만 DB에 갱신된다.
			else{
				svo=sellBoardService.updateContentExceptFile(svo);
			}
		}
		urlPath="sell_content";
		return new ModelAndView("sell/"+urlPath,"svo", svo);
	}
	/**
	 * 검색어를 이용해서 게시판을 조회하는 메서드
	 * @param request
	 * @param response
	 * @param sbsvo
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView getContentListByKeyword(HttpServletRequest request, 
			HttpServletResponse response, SellBoardSearchVO sbsvo) throws SQLException{
		// 검색어 및 검색조건등을 이용해서 정보를 찾아온다.
		ListVO lvo=sellBoardService.getContentListByKeyword(sbsvo);
		Map searchInfo=new HashMap();
		searchInfo.put("lvo", lvo);
		searchInfo.put("sbsvo", sbsvo);
		return new ModelAndView("sell/sell_list_by_searching","searchInfo",searchInfo);
	}
	/**
	 * 게시글을 수정할 때, 업로드 했던 파일 옆에 있는 삭제 버튼을 클릭하면 해당 파일 삭제 및 
	 * DB에 저장된 파일명을 null값으로 업데이트 하는 메서드
	 * @param request
	 * @param response
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView deleteFile(HttpServletRequest request, 
			HttpServletResponse response) throws SQLException{
		// 삭제할 파일명을 받아온다.
		String filename=request.getParameter("filename");
		// 실제 저장된 파일을 삭제한다.
		File file=new File(this.path+filename);
		file.delete();
		// DB에 저장되 있는 파일 이름도 삭제한다.
		sellBoardService.deleteFileName(filename);
		return new ModelAndView("JsonView","message","파일 삭제완료");
	}
}
